package cn.edu.zafu.bigdata.x.Foo;

abstract class Shape {
    // 抽象方法，用于计算形状的面积
    public abstract double area();

    // 抽象方法，用于计算形状的周长
    public abstract double perimeter();

    // final方法，用于打印形状的类型、面积和周长
    public final void display() {
        System.out.println("The area is: " + area());
        System.out.println("The perimeter is: " + perimeter());
    }
}

class Circle extends Shape {
    // Circle类的属性radius
    private double radius;

    // Circle类的构造函数
    public Circle(double radius) {
        this.radius = radius;
    }

    // 实现area()方法
    @Override
    public double area() {
        return Math.PI * radius * radius;
    }

    // 实现perimeter()方法
    @Override
    public double perimeter() {
        return 2 * Math.PI * radius;
    }
}

class Rectangle extends Shape {
    // Rectangle类的属性length和width
    private double length;
    private double width;

    // Rectangle类的构造函数
    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    // 实现area()方法
    @Override
    public double area() {
        return length * width;
    }

    // 实现perimeter()方法
    @Override
    public double perimeter() {
        return 2 * (length + width);
    }
}

public class TestShape {
    public static void main(String[] args) {
        // 创建Circle和Rectangle的实例
        Shape circle = new Circle(5);
        Shape rectangle = new Rectangle(3, 4);

        // 调用每个实例的display()方法
        circle.display();
        rectangle.display();

        // display()是一个final方法，所以不能被子类重写
    }
}
